home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / ClassBrowser.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  8KB  |  283 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """Class browser.
  5.  
  6. XXX TO DO:
  7.  
  8. - reparse when source changed (maybe just a button would be OK?)
  9.     (or recheck on window popup)
  10. - add popup menu with more options (e.g. doc strings, base classes, imports)
  11. - show function argument list? (have to do pattern matching on source)
  12. - should the classes and methods lists also be in the module's menu bar?
  13. - add base classes to class browser tree
  14. """
  15. import os
  16. import sys
  17. import pyclbr
  18. import PyShell
  19. from WindowList import ListedToplevel
  20. from TreeWidget import TreeNode, TreeItem, ScrolledCanvas
  21. from configHandler import idleConf
  22.  
  23. class ClassBrowser:
  24.     
  25.     def __init__(self, flist, name, path):
  26.         self.name = name
  27.         self.file = os.path.join(path[0], self.name + '.py')
  28.         self.init(flist)
  29.  
  30.     
  31.     def close(self, event = None):
  32.         self.top.destroy()
  33.         self.node.destroy()
  34.  
  35.     
  36.     def init(self, flist):
  37.         self.flist = flist
  38.         pyclbr._modules.clear()
  39.         self.top = top = ListedToplevel(flist.root)
  40.         top.protocol('WM_DELETE_WINDOW', self.close)
  41.         top.bind('<Escape>', self.close)
  42.         self.settitle()
  43.         top.focus_set()
  44.         theme = idleConf.GetOption('main', 'Theme', 'name')
  45.         background = idleConf.GetHighlight(theme, 'normal')['background']
  46.         sc = ScrolledCanvas(top, bg = background, highlightthickness = 0, takefocus = 1)
  47.         sc.frame.pack(expand = 1, fill = 'both')
  48.         item = self.rootnode()
  49.         self.node = node = TreeNode(sc.canvas, None, item)
  50.         node.update()
  51.         node.expand()
  52.  
  53.     
  54.     def settitle(self):
  55.         self.top.wm_title('Class Browser - ' + self.name)
  56.         self.top.wm_iconname('Class Browser')
  57.  
  58.     
  59.     def rootnode(self):
  60.         return ModuleBrowserTreeItem(self.file)
  61.  
  62.  
  63.  
  64. class ModuleBrowserTreeItem(TreeItem):
  65.     
  66.     def __init__(self, file):
  67.         self.file = file
  68.  
  69.     
  70.     def GetText(self):
  71.         return os.path.basename(self.file)
  72.  
  73.     
  74.     def GetIconName(self):
  75.         return 'python'
  76.  
  77.     
  78.     def GetSubList(self):
  79.         sublist = []
  80.         for name in self.listclasses():
  81.             item = ClassBrowserTreeItem(name, self.classes, self.file)
  82.             sublist.append(item)
  83.         
  84.         return sublist
  85.  
  86.     
  87.     def OnDoubleClick(self):
  88.         if os.path.normcase(self.file[-3:]) != '.py':
  89.             return None
  90.         
  91.         if not os.path.exists(self.file):
  92.             return None
  93.         
  94.         PyShell.flist.open(self.file)
  95.  
  96.     
  97.     def IsExpandable(self):
  98.         return os.path.normcase(self.file[-3:]) == '.py'
  99.  
  100.     
  101.     def listclasses(self):
  102.         (dir, file) = os.path.split(self.file)
  103.         (name, ext) = os.path.splitext(file)
  104.         if os.path.normcase(ext) != '.py':
  105.             return []
  106.         
  107.         
  108.         try:
  109.             dict = pyclbr.readmodule_ex(name, [
  110.                 dir] + sys.path)
  111.         except ImportError:
  112.             msg = None
  113.             return []
  114.  
  115.         items = []
  116.         self.classes = { }
  117.         for key, cl in dict.items():
  118.             if cl.module == name:
  119.                 s = key
  120.                 if hasattr(cl, 'super') and cl.super:
  121.                     supers = []
  122.                     for sup in cl.super:
  123.                         if type(sup) is type(''):
  124.                             sname = sup
  125.                         else:
  126.                             sname = sup.name
  127.                             if sup.module != cl.module:
  128.                                 sname = '%s.%s' % (sup.module, sname)
  129.                             
  130.                         supers.append(sname)
  131.                     
  132.                     s = s + '(%s)' % ', '.join(supers)
  133.                 
  134.                 items.append((cl.lineno, s))
  135.                 self.classes[s] = cl
  136.                 continue
  137.         
  138.         items.sort()
  139.         list = []
  140.         for item, s in items:
  141.             list.append(s)
  142.         
  143.         return list
  144.  
  145.  
  146.  
  147. class ClassBrowserTreeItem(TreeItem):
  148.     
  149.     def __init__(self, name, classes, file):
  150.         self.name = name
  151.         self.classes = classes
  152.         self.file = file
  153.         
  154.         try:
  155.             self.cl = self.classes[self.name]
  156.         except (IndexError, KeyError):
  157.             self.cl = None
  158.  
  159.         self.isfunction = isinstance(self.cl, pyclbr.Function)
  160.  
  161.     
  162.     def GetText(self):
  163.         if self.isfunction:
  164.             return 'def ' + self.name + '(...)'
  165.         else:
  166.             return 'class ' + self.name
  167.  
  168.     
  169.     def GetIconName(self):
  170.         if self.isfunction:
  171.             return 'python'
  172.         else:
  173.             return 'folder'
  174.  
  175.     
  176.     def IsExpandable(self):
  177.         if self.cl:
  178.             
  179.             try:
  180.                 return not (not (self.cl.methods))
  181.             except AttributeError:
  182.                 return False
  183.             except:
  184.                 None<EXCEPTION MATCH>AttributeError
  185.             
  186.  
  187.         None<EXCEPTION MATCH>AttributeError
  188.  
  189.     
  190.     def GetSubList(self):
  191.         if not self.cl:
  192.             return []
  193.         
  194.         sublist = []
  195.         for name in self.listmethods():
  196.             item = MethodBrowserTreeItem(name, self.cl, self.file)
  197.             sublist.append(item)
  198.         
  199.         return sublist
  200.  
  201.     
  202.     def OnDoubleClick(self):
  203.         if not os.path.exists(self.file):
  204.             return None
  205.         
  206.         edit = PyShell.flist.open(self.file)
  207.         if hasattr(self.cl, 'lineno'):
  208.             lineno = self.cl.lineno
  209.             edit.gotoline(lineno)
  210.         
  211.  
  212.     
  213.     def listmethods(self):
  214.         if not self.cl:
  215.             return []
  216.         
  217.         items = []
  218.         for name, lineno in self.cl.methods.items():
  219.             items.append((lineno, name))
  220.         
  221.         items.sort()
  222.         list = []
  223.         for item, name in items:
  224.             list.append(name)
  225.         
  226.         return list
  227.  
  228.  
  229.  
  230. class MethodBrowserTreeItem(TreeItem):
  231.     
  232.     def __init__(self, name, cl, file):
  233.         self.name = name
  234.         self.cl = cl
  235.         self.file = file
  236.  
  237.     
  238.     def GetText(self):
  239.         return 'def ' + self.name + '(...)'
  240.  
  241.     
  242.     def GetIconName(self):
  243.         return 'python'
  244.  
  245.     
  246.     def IsExpandable(self):
  247.         return 0
  248.  
  249.     
  250.     def OnDoubleClick(self):
  251.         if not os.path.exists(self.file):
  252.             return None
  253.         
  254.         edit = PyShell.flist.open(self.file)
  255.         edit.gotoline(self.cl.methods[self.name])
  256.  
  257.  
  258.  
  259. def main():
  260.     
  261.     try:
  262.         file = __file__
  263.     except NameError:
  264.         file = sys.argv[0]
  265.         if sys.argv[1:]:
  266.             file = sys.argv[1]
  267.         else:
  268.             file = sys.argv[0]
  269.     except:
  270.         sys.argv[1:]
  271.  
  272.     (dir, file) = os.path.split(file)
  273.     name = os.path.splitext(file)[0]
  274.     ClassBrowser(PyShell.flist, name, [
  275.         dir])
  276.     if sys.stdin is sys.__stdin__:
  277.         mainloop()
  278.     
  279.  
  280. if __name__ == '__main__':
  281.     main()
  282.  
  283.